home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 13, No. 03 (1992-03)(MindCraft Publishing)(Side A).zip
/
Nibble Volume 13, No. 03 (1992-03)(MindCraft Publishing)(Side A).po
/
SWAP.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
7KB
|
290 lines
* SWAP VARIABLES
* COPYRIGHT (C) 1982
* DIGIPAC COMPUTER CONSULTING
REP 40
*
* APPLESOFT USAGE
*
REP 40
CHKCOM EQU $DEBE
CHKOPN EQU $DEBB
CHRGET EQU $B1
CHRGOT EQU $B7
FNDLIN EQU $D61A
FRMNUM EQU $DD67
GETADR EQU $E752
LINNUM EQU $50
SYNERR EQU $DEC9
REP 40
*
* ZERO PAGE
*
REP 40
LEN1 EQU $8
LEN2 EQU $9
NXTLIN EQU $19
THSLIN EQU $9B
REP 40
*
* CONSTANTS
*
REP 40
MSB OFF
COMMA EQU ','
CLOSE EQU ')'
QUOTE EQU '"'
COLON EQU ':'
EOL EQU 0
REM EQU 178
DATA EQU 131
OPEN EQU '('
INTEGER EQU '%'
STRING EQU '$'
MSB ON
*
* STORAGE
*
VBLSTR EQU $200
*
ORG $9470
*
REP 40
*
* MAIN SEQUENCE
*
REP 40
JSR CHKOPN ; IS OPENING '('?
JSR FRMNUM ; GET STARTING LINE
JSR GETADR
LDA LINNUM
STA STRLIN ; STORE STARTING LINE NUMBER
LDA LINNUM+1
STA STRLIN+1
JSR CHKCOM
JSR FRMNUM ; GET ENDING LINE
JSR GETADR
LDA LINNUM
STA ENDLIN ; STORE ENDING LINE NUMBER
LDA LINNUM+1
STA ENDLIN+1
STRTFND LDA STRLIN ; RESTORE START LINE # TO ZERO PAGE
STA LINNUM
LDA STRLIN+1
STA LINNUM+1
JSR FNDLIN ; FIND THE STARTING LINE
JSR FNDVAR
STRTSCH JSR SRCHLIN ; SEARCH LINE FOR VARIABLES
JSR LASTCHK
LDA #CLOSE ; IS THIS LAST LINE?
CMP LINFLG
BNE NULINE ; NO, GET THE NEXT LINE
LDA #CLOSE ; ARE THERE MORE VARIABLES?
CMP ENDFLG
BNE STRTFND ; THEN GET NEXT SET OF VARIABLES
RTS ; RETURN TO BASIC
NULINE JSR NEXTLINE
JMP STRTSCH
REP 40
*
* FIND AND STORE VARIABLES
*
REP 40
FNDVAR JSR CHRGOT
CMP #COMMA ; IF NO COMMA THEN SYNTAX ERROR
BEQ INITIAL
ERR JSR SYNERR
INITIAL LDX #0
LDY #0
JSR GETCHAR
CPX #0
BEQ ERR ; NO FIRST VARIABLE
CMP #CLOSE
BEQ ERR ; NO SECOND VARIABLE ERROR
DEX
STX LEN1 ; STORE LENGTH OF FIRST VARIABLE
LDX #0
JSR GETCHAR
CPX #0 ; SECOND VARIABLE IS A BLANK
BEQ ERR ;NO SECOND VARIABLE ERROR
DEX
STX LEN2 ; STORE SECOND VARIABLE LENGTH
RTS
REP 40
*
* SEARCH THE LINE
*
REP 40
SRCHLIN LDX #0
JSR OLDLNK
JSR LASTCHK
LDY #4
GETDAT LDA (THSLIN),Y ; GET CHARACTER, THEN CHECK FOR
CMP #EOL ; : END OF LINE
BEQ RETURN1
CMP #REM ; : REM?
BEQ RETURN1
CMP #QUOTE ; : QUOTED STRING?
BEQ STRTQUO
CMP #DATA ; : DATA STATEMENT?
BEQ STRTDAT
CMP VBLSTR,X ; COMPARE TO STORED VARIABLE
BEQ STRGSAM
INY
LDX #0
JMP GETDAT ; NO MATCH- GET ANOTHER
STRGSAM CPX LEN1 ; IF END OF VARIABLE NAME REACHED
BEQ SWAP ; THEN GO TO SWAP
INX ; ELSE GET ANOTHER CHARACTER
INY
JMP GETDAT
SWAP JSR SWAPVAR ; RUN SWAPPING ROUTINE
INY
LDX #0 ; RESET FOR NEXT OCCURANCE
JMP GETDAT
STRTDAT LDA #COLON ; FIND NEXT BASIC STATEMENT
STA COMPAR
JSR FINDCLS
NEWSTM CMP #EOL
BEQ RETURN1
JMP GETDAT
STRTQUO LDA #QUOTE ; FIND ENDING QUOTE
STA COMPAR
JSR FINDCLS
JMP NEWSTM
RETURN1 RTS
REP 40
*
* MAKE THE SWAP
*
REP 40
SWAPVAR INY
LDA (THSLIN),Y ; CHECK FOR VARIABLE TYPE MATCH
CMP #STRING
BEQ RETURN2
CMP #INTEGER
BEQ RETURN2
CMP #OPEN
BEQ RETURN2
DEY ; MOVE POINTER TO BEG OF VARIABLE
TYA
SEC
SBC LEN1
TAY
INX
LDA LEN2 ; USE VARIABLE LENGTH 2 AS A COUNTER
STA VBLLEN
INC VBLLEN
MOVCHAR LDA VBLSTR,X
STA (THSLIN),Y ; MAKE THE SWAP
INY
INX
DEC VBLLEN
BNE MOVCHAR ; ALL SECOND VARIABLE TRANSFERRED?
JSR MAKLEN
RTS
RETURN2 DEY
RTS
REP 40
*
* FIND END OF QUOTE OR DATA STATEMENT
*
FINDCLS INY
NEXT1 LDA (THSLIN),Y
CMP #EOL ; LOOK FOR END OF LINE
BEQ ENDLIN1
INY
CMP COMPAR ; LOOK FOR COLON OR QUOTE
BNE NEXT1
ENDLIN1 RTS
REP 40
*
* GET AND STORE A VARIABLE CHARACTER
*
REP 40
GETCHAR LDA #0
STA ENDFLG ; CLEAR END FLAG
GETCHR1 JSR CHRGET ; NEXT CHARACTER IN CALLING SEQUENCE
CMP #COMMA ; EACH VARIABLE TERMINATED BY ','
BEQ RETURN3
CMP #CLOSE ; OR ')'
BEQ CLOSE1
STA VBLSTR,Y ; SAVE THE CHARACTER
INX
INY
JMP GETCHR1 ; GET ANOTHER CHARACTER
CLOSE1 JSR CHRGET
LDA #CLOSE ; LAST VARIABLE FOUND
STA ENDFLG
RETURN3 RTS
REP 40
*
* CHECK IF LAST LINE REACHED
*
REP 40
LASTCHK LDY #3
LDA (THSLIN),Y
CMP ENDLIN+1 ; COMPARE CURRENT LINE# TO LAST
BCC RETURN4
DEY
LDA (THSLIN),Y
CMP ENDLIN
BCC RETURN4
LDA #CLOSE ; SET THE LAST LINE FLAG
STA LINFLG
RTS
RETURN4 LDA #0
STA LINFLG
RTS
REP 40
*
* SET POINTER TO NEXT LINE
*
REP 40
NEXTLINE LDA NXTLIN
STA THSLIN
LDA NXTLIN+1
STA THSLIN+1
RTS
REP 40
*
* SAVE THE NEXT LINK ADDRESS
*
REP 40
OLDLNK LDY #0
LDA (THSLIN),Y ;SAVE NEXT LINE ADDRESS
STA NXTLIN
INY
LDA (THSLIN),Y
STA NXTLIN+1
RTS
REP 40
*
* MAKE LENGTH OF VARIABLES THE SAME
*
REP 40
MAKLEN LDA LEN1
SEC
SBC LEN2
BEQ RETURN5 ; IF SAME LENGTH THEN EXIT
BMI RETURN5 ; IF LEN1 < LEN 2 THEN EXIT
STA TEMP ; SAVE LENGTH REMAINING
STORBLK LDA #$20
STA (THSLIN),Y ; SAVE A BLANK
INY
DEC TEMP
BNE STORBLK
RETURN5 RTS
REP 40
*
* STORAGE
*
REP 40
COMPAR DS 1
ENDFLG DS 1
ENDLIN DS 2
LINFLG DS 1
STRLIN DS 2
VBLLEN DS 1
TEMP DS 1
LST OFF